package com.myupload.demo.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Service
public class UploadService {
    @Value("${file.staticPath}")
    private String rootPtah;

    @Value("${file.uploadFolder}")
    private String uploadFolder;
    /**
     * @name:
     * @params:
     * @description:
     * MultipartFile 这个对象是springmvc提供的文件上传的接受的类，
     * 它的底层自动会去和HttpServletRequest request.getInputStream()融合
     * 从而达到文件上传的效果；
     * MultipartFile 文件被服务器接收会产生一个临时目录：可以进行配置
     * 文件上传的类型也可以进行配置
     *
     * 2文件上传不会直接上传真实的目录，它一定要经过一个临时目录中转之后，才会上传到真实目录
     * 作用:防止网络断开，或者用户刷新或者直接取消。如果中断的话就会产生大量的垃圾文件
     * 保证真实目录上传的文件一定是有效的
     * 3以前javaweb
     * request.getServletContext().getContextPath()，获取的是tomcat下面的工程目录，直接访问localhost加这个目录
     * 就可以访问；
     * 但是 springboot怎么办呢？springboot有一个static目录可以直接通过http访问，但是打成jar包之后没办法直接往里面写东西进去
     * ，所以springboot提供了静态资源目录的映射机制；类似nginx静态资源映射 /img
     * @return:
     * @exception/throws:
     * @author: zxb
     * @date:   2021/11/13
     */
    public String UploadImg(MultipartFile multipartFile,String dir){
        //1指定文件上传的目录
        try {

            //1：获取源文件名字 例如：拿到aaa.jpg
            String realfilename = multipartFile.getOriginalFilename();
            //2：获取文件名后缀 例如：.jpg
            String imgSuffix=realfilename.substring(realfilename.lastIndexOf("."));
            //3：生成的唯一文件名,不要使用中文命名，原则问题，会出现乱码 :246457634HGDSDF.jpg
            String  newFilename= UUID.randomUUID().toString()+imgSuffix;
            //4 日期目录 2021-11-29
            SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
            String datePath = sf.format(new Date());
            //5:指定文件上传之后的目录  D://tmp/avatar/2021-11-29
            File targetPath=new File(uploadFolder+dir,datePath);
            if(!targetPath.exists()){
                targetPath.mkdirs();
            }
            //6: 指定文件上传以后的服务器完整路径: D://tmp/avatar/2021-11-29/246457634HGDSDF.jpg
            File targetFileName=new File(targetPath,newFilename);
            //7：上传文件到指定目录
            multipartFile.transferTo(targetFileName);
            //可访问路径返回到页面：http:8777/bbs/2021-11-29/423525.jpg
            String filename=dir+"/"+datePath+"/"+newFilename;
            return rootPtah+"/"+filename;

        }catch (Exception e){
            e.printStackTrace();
            return "fails";
        }

    }
    public Map<String,Object> UploadImgGMap(MultipartFile multipartFile,String dir) {
        //1指定文件上传的目录
        try {

            //1：获取源文件名字 例如：拿到aaa.jpg
            String realfilename = multipartFile.getOriginalFilename();
            //2：获取文件名后缀 例如：.jpg
            String imgSuffix = realfilename.substring(realfilename.lastIndexOf("."));
            //3：生成的唯一文件名,不要使用中文命名，原则问题，会出现乱码 :246457634HGDSDF.jpg
            String newFilename = UUID.randomUUID().toString() + imgSuffix;
            //4 日期目录 2021-11-29
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
            String datePath = sf.format(new Date());
            //5:指定文件上传之后的目录  D://tmp/avatar/2021-11-29
            File targetPath = new File(uploadFolder + dir, datePath);
            if (!targetPath.exists()) {
                targetPath.mkdirs();
            }
            //6: 指定文件上传以后的服务器完整路径: D://tmp/avatar/2021-11-29/246457634HGDSDF.jpg
            File targetFileName = new File(targetPath, newFilename);
            //7：上传文件到指定目录
            multipartFile.transferTo(targetFileName);
            //可访问路径返回到页面：http:8777/bbs/2021-11-29/423525.jpg
            String filename = dir + "/" + datePath + "/" + newFilename;
            Map<String , Object> map = new HashMap<>();
            map.put("url",rootPtah + "/" + filename);
            map.put("size",multipartFile.getSize());
            map.put("suffix",imgSuffix);
            map.put("filename",realfilename);
            map.put("rpath",dir+"/"+datePath+"/"+newFilename);
            return map ;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
